package JUC.多线程;

import java.util.concurrent.*;

/**
 * @author CKC
 * @DateTime 2021/4/2 10:07
 * <p>
 * 第4种获得/使用Java多线程的方式，线程池
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,
                5,
                1000L,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy()/**拒绝策略*/);
        /**
         * *    观察JDK内置的拒绝策略：
         * new ThreadPoolExecutor.AbortPolicy()
         * *        直接抛出RejectedExecutionException  异常阻止系统正常运行。
         * new ThreadPoolExecutor.CallerRunsPolicy()
         * *        "调用者运行"一种调节机制，该策略既不会抛弃任务，也不会抛出异常，而是将某些任务回退到调用者,从而降低新任务的流量。
         * new ThreadPoolExecutor.DiscardOldestPolicy()
         * *        抛弃队列中等待最久的任务，然后把当前任务加入队列中尝试再次提交当前任务。
         * new ThreadPoolExecutor.DiscardPolicy()
         * *        直接丢弃任务，不予任何处理也不抛出异常。如果允许任务丢失，这是最好的一种方案。
         */

        //模拟10个用户来办理业务，每一个用户就是一个来自外部的请求线程
        try {
            for (int i = 1; i <= 100; i++) {
                final int aa = i;
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务" + aa);
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

        ExecutorService executorService = Executors.newWorkStealingPool();
    }

    private static void threadPoolInit() {//JDK 版本的
        ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池 nThread=5个线程池。
        ExecutorService threadPool1 = Executors.newSingleThreadExecutor();//一池1个线程池。
        ExecutorService threadPool2 = Executors.newCachedThreadPool();//一池N个线程池。底层最大Integer.MAX_VALUE 个线程
        /**
         * threadPool.execute(Runnable command);
         * threadPool.submit(Runnable task);
         * threadPool.submit(Callable<T>  task);
         * threadPool.submit(Runnable task,T result);
         */
        //模拟10个用户来办理业务，每一个用户就是一个来自外部的请求线程
        try {
            for (int i = 1; i <= 10; i++) {
                final int aa = i;
                threadPool.execute(() -> {
                    //try { TimeUnit.SECONDS.sleep(1); }catch (InterruptedException e){ e.printStackTrace(); }
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务" + aa);
                });
                //try { TimeUnit.MILLISECONDS.sleep(100); }catch (InterruptedException e){ e.printStackTrace(); }
            }
        } catch (Exception e) {

        } finally {
            threadPool.shutdown();
        }
    }
}
